<

MouseTracker は注釈を添付しなくなりました

まとめ

削除されましたMouseTrackerのメソッドattachAnnotationdetachAnnotation、 とisAnnotationAttached

コンテクスト

マウス イベント (マウス ポインターが領域に入ったときなど) 終了したこと、または領域上でホバリングしていることは、次の助けを借りて検出されます。MouseTrackerAnnotation関心のある領域に配置される レンダリングフェーズ中。更新(新しいフレームまたは新しいイベント)のたびに、MouseTrackerマウスがホバーした注釈を比較します 更新前後のポインター、その後のディスパッチ それに応じてコールバックが行われます。

MouseTrackerマウスポインタの状態を管理するクラス、 以前は必要だったMouseRegionマウント時に注釈を付けるには、 アンマウント時に注釈を切り離します。 これを使用したのは、MouseTrackerを実行するマウント出口チェック(例えば、MouseRegion.onExitアンマウントによって終了した場合は呼び出さないでください。 ウィジェットの)、呼び出しを防ぐためsetStateアンマウントされたウィジェットと例外のスロー (説明済み) 詳しくは問題 #44631)。

このメカニズムは次のように置き換えられました。MouseRegionマウントされた終了を実行できるステートフル ウィジェット アンマウント時にコールバックをブロックすることで、それ自体をチェックします。 したがって、これらのメソッドは削除され、MouseTracker画面上のすべての注釈を追跡しなくなりました。

変更内容の説明

MouseTrackerクラスは関連する 3 つのメソッドを削除しました 注釈を添付するには:

 class MouseTracker extends ChangeNotifier {
   // ...
-  void attachAnnotation(MouseTrackerAnnotation annotation) {/* ... */}

-  void detachAnnotation(MouseTrackerAnnotation annotation) {/* ... */}

-  @visibleForTesting
-  bool isAnnotationAttached(MouseTrackerAnnotation annotation) {/* ... */}
 }

RenderMouseRegionMouseTrackerAnnotationもう実行しない マウント出口チェック、その間MouseRegionまだそうです。

移行ガイド

に電話をかけるMouseTracker.attachAnnotationdetachAnnotationほとんど影響を与えずに削除する必要があります。

  • の用途MouseRegionまったく影響を受けないはずです。
  • コードで直接使用している場合RenderMouseRegionまたMouseTrackerAnnotation、 を注意onExitを使用したイベントによって終了が発生したときに呼び出されるようになりました。 電話するMouseTracker.detachAnnotation。 国家が関与しない場合にはこれは問題にはなりませんが、 それ以外の場合は、マウント出口チェックを追加することをお勧めします。 特にコールバックがリークされた場合、外部の ウィジェットが呼び出す可能性があります72be5d56-5a22-4181-ベッド5-66612be9f6fd初期化。例えば:

移行前のコード:

class MyMouseRegion extends SingleChildRenderObjectWidget {
  const MyMouseRegion({this.onHoverChange});

  final ValueChanged<bool> onHoverChange;

  @override
  RenderMouseRegion createRenderObject(BuildContext context) {
    return RenderMouseRegion(
      onEnter: (_) { onHoverChange(true); },
      onExit: (_) { onHoverChange(false); },
    );
  }

  @override
  void updateRenderObject(BuildContext context, RenderMouseRegion renderObject) {
    renderObject
      ..onEnter = (_) { onHoverChange(true); }
      ..onExit = (_) { onHoverChange(false); };
  }
}

移行後のコード:

class MyMouseRegion extends SingleChildRenderObjectWidget {
  const MyMouseRegion({this.onHoverChange});

  final ValueChanged<bool> onHoverChange;

  @override
  RenderMouseRegion createRenderObject(BuildContext context) {
    return RenderMouseRegion(
      onEnter: (_) { onHoverChange(true); },
      onExit: (_) { onHoverChange(false); },
    );
  }

  @override
  void updateRenderObject(BuildContext context, RenderMouseRegion renderObject) {
    renderObject
      ..onEnter = (_) { onHoverChange(true); }
      ..onExit = (_) { onHoverChange(false); };
  }

  @override
  void didUnmountRenderObject(RenderMouseRegion renderObject) {
    renderObject
      ..onExit = onHoverChange == null ? null : (_) {};
  }
}

に電話をかけるMouseTracker.isAnnotationAttached削除する必要があります。 この機能は技術的に不可能になりましたが、 注釈は追跡されなくなったため。 何らかの理由でこの機能が必要な場合は、問題を送信してください。

タイムライン

リリースされたバージョン: 1.15.4
安定版リリース: 1.17

参考文献

API ドキュメント:

  • MouseRegion
  • MouseTracker
  • MouseTrackerAnnotation
  • RenderMouseRegion

関連する PR:

  • MouseTracker では注釈を添付する必要がなくなりました、 変化をもたらしたのは
  • MouseTracker ライフサイクルの改善: チェックをポストフレームに移動、 最初にマウント出口の変更を導入しました。 で説明しましたonExit への変更